package threaddemo14;

import java.util.Date;

/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2022-08-07
 * Time: 16:23
 */
//消费者对象吃货
/*
消费者类(Foodie)：继承Thread，重写run()方法，设置线程任务
1.判断是否有包子,决定当前线程是否执行
2.如果没有包子,就进入等待状态,如果有包子,就消费包子
3.消费包子后,更新桌子上包子状态,唤醒生产者生产包子
*/
public class Foodie extends  Thread{
    private Desk desk;
    public Foodie(Desk desk) {
    
        this.desk=desk;
    }
    
    @Override
    public void run() {
        while (true){
            //套路:
            //1. while(true)死循环
            //2. synchronized 锁,锁对象要唯一
            //3. 判断,共享数据是否结束. 结束
            //4. 判断,共享数据是否结束. 没有结束
            synchronized (desk.getLock()){
                if(desk.getCount()==0){
                    break; //所有的包子都吃完了就退出
                }else{
                    if(desk.isFlag()){
                        //有包子就开吃，厨师进行等待
                        System.out.println("吃货在吃包子");
                        desk.setFlag(false);//标记为桌子上没有了包子
                        //唤醒厨师做包子
                        desk.getLock().notifyAll();
                        //总的包子数减一
                        desk.setCount(desk.getCount()-1);
                    }else{
                        //桌子没有包子就等待厨师做包子
                        try {
                            desk.getLock().wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}
